Comment
faire un OS ?
Introduction :
Tout
dabord, que'est ce quun OS ?
Un OS
(Operating System) permet de gérer plusieurs applications sur un
même ordinateur. Vous connaissez sûrement Windows, Linus ou
MacOS. Vous avez donc maintenant une idée de ce que nous allons
faire
Avant
d'aborder le vif du sujet, quelques rappels.
Pour créer un
OS, il faut dabord connaître l'ASM (le langage connu du
processeur) puis comprendre ce que fait un ordinateur quand on
l'allume. Je ne fais pas un cours sur lASM. Si vous aves
des questions sur ce sujet, vous rouverez des infos sur Google par exemple en tapant
"ASM tutorial".
On s'interesse
donc à la question : qu'est ce que fait un ordinateur quand on
l'allume.
De façon
simple, on peut dire qu'au démarrage lordinateur lance
l'instruction ASM qui se trouve au début du disque de boot
(première piste (0), premier secteur (1)), puis il passe à la
seconde et ainsi de suite.
Quand on met
une disquette, c'est elle qui devient disque de boot. Sinon, par
défaut c'est le disque dur.
Vous pouvez
bien sur modifier cela en intervenant sur le Bios.
L'OS que nous
allons réaliser sera sur une disquette de façon à être
facilement manipulable et sans danger pour les fichiers présents
sur le disque dur.
Ce tutorial
est construit sur une suite de petits exemples d'un OS.
Si vous
développez sous Windows, vous pouvez télécharger Nasm qui vous
servira à compiler votre OS.
Toutes les
fonctions utilisées dans ce tutorial , sont expliquées dans le
fichier suivant : Télécharger
Dans le vif du
sujet :
I - Le
premier programme
Le premier
programme sera découpé en deux parties :
-
Une partie qui sera exécutée sous Windows (ou un autre OS), et
qui copiera l'OS sur disquette
-
L'OS en question sera ensuite exécuté au démarrage de
l'ordinateur.
La suite
comporte 3 ou 4 parties.
La première
partie, copie l'OS sur la disquette et utilise l'interruption
03H.
Écriture
sur une disquette Entrée : AH
= 03h
DL = Numéro du lecteur de disquette (0 pour
A:, 1pour B:
)
DH = Numéro de la face de disquette (0 ou
1)
CH = Numéro de piste (divisions de la
disquette)
CL = Numéro de secteur (divisions de la
disquette)
AL = Nombre de secteurs à écrire (taille
de la copie)
ES = Adresse de segment du buffer (ne pas
s'en occuper pour le moment)
BX = Adresse d'offset du buffer (ne pas
s'en occuper pour le moment) Sortie : Flag Carry
=0 : Opération exécutée, dans ce cas AH=0
Flag Carry =1 : Erreur, dans ce cas AH=Code d'erreur |
Vous voyez, rien de
bien sorcier, il reste juste à mettre du texte autour pour faire
joli J.
La seconde
partie est l'OS lui même. Pour le moment on affiche simplement
"Bonjour", mais avant de faire quoi que ce soit il faut
initialiser la pile.
Initialisation
de la pile mov
ax,0x07C0 ; segment code mov ds,ax mov es,ax mov
ax,0x8000 ; pile mov ss,ax mov sp,
0xf000 |
Cette partie
du programme, s'exécute avant que Windows soit chargé (pas
possible d'utiliser les fonctions de ce dernier). Pour afficher
du texte nous utilisons l'interruption 10h
Affichage
à l'écran Entrée : AH
= 0Eh
AL = Code ASCII du caractère BL
= Couleur de premier plan du caractère (en mode
graphique uniquement) Sortie : aucune
sortie |
Pour afficher
"bonjour" il faudra donc répété la fonction 7 fois.
Affichage
"bonjour" mov ah,0eh mov al,07h
; ==== Faire un BEEP === int 10h mov al,' '
; ==== Faire 8 espaces === int 10h int 10h int 10h int 10h int 10h int 10h int 10h int 10h mov al,'B'
; ==== Afficher b === int 10h mov al,'o' int 10h mov al,'n' int 10h mov al,'j' int 10h mov al,'o' int 10h mov al,'u' int 10h mov al,'r' int 10h boucleinfinie:
; ==== ne plus rien faire ==== jmp
boucleinfinie |
Bien sur, une
fois que l'exécution du programme est finie, pour revenir sur
votre OS, il faut enlever la disquette et appuyer sur CTRL + ALT
+ SUPPR.
Voilà, si
vous avez un peu la flemme de tout taper, vous pouvez
télécharger le tout ici.
Voilà, le
premier programme est fini, j'espère que vous n'avez pas trouvé
ça trop dur J.
La suite dès que
je l'ai écrite